<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no">
    <meta http-equiv="X-UA-Compatible" content="ie=edge,chrome=1">
    <meta name="referrer" content="never">
    <title>apply</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        ul {
            list-style: none;
        }
    </style>
</head>
<body>
    
    <script type="text/javascript">
        /* 
        fn.apply(thisObj, [数组或者伪数组形式参数])
            调用函数，以第一个参数替换函数中的 this，与 call 方法不同的是，参数的传递形式改为数组或者伪数组

            如果第一个参数无法识别为对象，使用全局对象替换

            常用于函数呼叫转移：将一个函数的this以及所有参数传递给另一个函数
        */

        var uname = "window";

        function sayName(){
            console.log(this.uname);
        }

        var user = {
            uname: "李白"
        }

        sayName(); // window
        sayName.apply(user); // 李白


        function sing(status, lyric){
            console.log(this.uname + " " + status + " sing: " + lyric);
        }

        sing("开心的", "我在遥望...");
        sing.call(user, "伤心的", "我像只鱼儿...");
        sing.apply(user, ["伤心的", "我像只鱼儿..."]);

        console.clear();

        function sum(...args){
            var count = 0;
            args.forEach(function (item){
                count += item;
            })
            return count;
        }

        function sum2x(){
            return sum.apply(null, arguments) * 2;
        }

        console.log(sum2x(1,2,3,5,4)); // 30
    </script>
</body>
</html>